大家好,我是正在实战各种 AI 项目的程序员晚枫。
😫 开篇:Docker 部署是我见过最优雅的部署方式
"晚枫,有没有一种部署方式,能在任何云平台通用?"
有!Docker 容器化部署。一次打包,到处运行,阿里云腾讯云华为云 AWS 通吃。
今天把 Docker 部署 OpenClaw 的完整手册整理出来,照着做,20 分钟搞定。
📋 部署前准备
1. 基础要求
1 2 3 4
| ✓ 任意 Linux 服务器(Ubuntu/CentOS/Debian) ✓ 2 核 4G 以上配置 ✓ 能访问外网(下载镜像) ✓ Docker 环境(没有的话我来教你装)
|
2. 为什么选 Docker?
| 对比项 | 传统部署 | Docker 部署 |
|---|
| 环境配置 | 每台服务器都要配 | 一次配置,到处运行 |
| 依赖管理 | 容易冲突 | 容器隔离,互不影响 |
| 版本升级 | 复杂,容易出错 | 换镜像即可,秒级回滚 |
| 迁移 | 麻烦,要重新配置 | 复制镜像就行 |
| 扩展 | 手动部署 | 自动扩缩容 |
结论:Docker 是未来,传统部署是过去。
🚀 部署步骤(超详细)
第 1 步:安装 Docker
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| curl -fsSL https://get.docker.com | bash systemctl enable docker systemctl start docker
yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io systemctl enable docker systemctl start docker
docker --version docker run hello-world
|
第 2 步:安装 Docker Compose
1 2 3 4 5 6 7 8
| curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
|
第 3 步:准备项目文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| mkdir -p /opt/openclaw cd /opt/openclaw
git clone https://github.com/openclaw/openclaw.git cd openclaw
|
第 4 步:配置环境变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| cat > .env << EOF # 应用配置 OPENCLAW_PORT=8000 OPENCLAW_HOST=0.0.0.0 OPENCLAW_ENV=production
# 数据库配置 DATABASE_URL=postgresql://openclaw:secure_password_123@postgres:5432/openclaw POSTGRES_USER=openclaw POSTGRES_PASSWORD=secure_password_123 POSTGRES_DB=openclaw
# Redis 配置 REDIS_URL=redis://redis:6379/0
# 安全配置 SECRET_KEY=$(openssl rand -hex 32) DEBUG=False
# 文件存储(可选,用本地或云存储) MEDIA_ROOT=/app/data/media STATIC_ROOT=/app/data/static EOF
|
第 5 步:配置 Docker Compose
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| version: '3.8'
services: app: build: . ports: - "${OPENCLAW_PORT}:8000" environment: - DATABASE_URL=${DATABASE_URL} - REDIS_URL=${REDIS_URL} - SECRET_KEY=${SECRET_KEY} - DEBUG=${DEBUG} volumes: - ./data/media:/app/data/media - ./data/static:/app/data/static depends_on: - postgres - redis restart: unless-stopped networks: - openclaw-network
postgres: image: postgres:14-alpine environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} volumes: - postgres-data:/var/lib/postgresql/data restart: unless-stopped networks: - openclaw-network
redis: image: redis:7-alpine command: redis-server --appendonly yes volumes: - redis-data:/data restart: unless-stopped networks: - openclaw-network
nginx: image: nginx:alpine ports: - "80:80" - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - ./data/static:/usr/share/nginx/html/static:ro - ./ssl:/etc/nginx/ssl:ro depends_on: - app restart: unless-stopped networks: - openclaw-network
volumes: postgres-data: redis-data:
networks: openclaw-network: driver: bridge
|
第 6 步:配置 Nginx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| events { worker_connections 1024; }
http { upstream openclaw { server app:8000; }
server { listen 80; server_name your-domain.com;
return 301 https://$server_name$request_uri; }
server { listen 443 ssl http2; server_name your-domain.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5;
location /static/ { alias /usr/share/nginx/html/static/; expires 30d; add_header Cache-Control "public, immutable"; }
location /media/ { alias /usr/share/nginx/html/media/; expires 7d; }
location / { proxy_pass http://openclaw; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } }
|
第 7 步:启动服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| docker-compose up -d --build
docker-compose ps
docker-compose logs -f
docker-compose down
docker-compose restart
|
第 8 步:配置 HTTPS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| mkdir -p ssl
docker run --rm -it \ -v /etc/letsencrypt:/etc/letsencrypt \ -v /var/lib/letsencrypt:/var/lib/letsencrypt \ certbot/certbot certonly \ --standalone \ -d your-domain.com
cp /etc/letsencrypt/live/your-domain.com/fullchain.pem ssl/ cp /etc/letsencrypt/live/your-domain.com/privkey.pem ssl/
docker-compose restart nginx
|
🔧 常用运维命令
查看日志
1 2 3 4 5 6 7 8 9
| docker-compose logs
docker-compose logs app docker-compose logs nginx
docker-compose logs -f app
|
进入容器
1 2 3 4 5 6 7 8
| docker-compose exec app bash
docker-compose exec postgres psql -U openclaw -d openclaw
docker-compose exec redis redis-cli
|
备份数据
1 2 3 4 5 6 7 8 9 10 11
| docker-compose exec postgres pg_dump -U openclaw openclaw > backup_$(date +%Y%m%d).sql
docker-compose exec -T postgres psql -U openclaw openclaw < backup_20260326.sql
docker run --rm \ -v openclaw_postgres-data:/data \ -v $(pwd):/backup \ alpine tar czf /backup/postgres-backup.tar.gz /data
|
更新版本
1 2 3 4 5 6 7 8 9
| git pull
docker-compose up -d --build
docker-compose pull docker-compose up -d --force-recreate --no-deps app
|
扩容
1 2 3 4
| docker-compose up -d --scale app=3
|
📊 性能优化建议
1. 资源限制
1 2 3 4 5 6 7 8 9 10 11
| services: app: deploy: resources: limits: cpus: '2' memory: 2G reservations: cpus: '1' memory: 1G
|
2. 健康检查
1 2 3 4 5 6 7
| services: app: healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3
|
3. 日志管理
1 2 3 4 5 6 7
| services: app: logging: driver: "json-file" options: max-size: "10m" max-file: "3"
|
💰 成本优化技巧
1. 镜像优化
1 2 3 4 5 6
| FROM python:3.10-slim as builder
FROM python:3.10-slim
|
2. 缓存优化
1 2 3 4 5 6
| COPY requirements.txt . RUN pip install -r requirements.txt
COPY . .
|
3. 资源优化
1 2 3 4 5 6 7 8
| docker image prune -a
docker container prune
docker volume prune
|
🔧 常见问题排查
问题 1:容器启动失败
1 2 3 4 5 6 7 8
| docker-compose logs app
docker-compose config
netstat -tlnp | grep 8000
|
问题 2:数据库连接失败
1 2 3 4 5 6 7 8
| docker-compose ps postgres
docker-compose exec app python -c "from urllib.parse import urlparse; print('OK')"
docker-compose logs postgres
|
问题 3:Nginx 无法访问
1 2 3 4 5 6 7 8
| docker-compose exec nginx nginx -t
docker-compose logs nginx
ls -la ssl/
|
🚀 更多应用场景
- 多环境部署(开发/测试/生产)
- CI/CD 集成
- Kubernetes 部署
- 混合云部署
💬 金句总结
Docker 让部署变得像搭积木一样简单。
一次打包,到处运行,这才是真正的 DevOps。
📚 相关阅读
🔗 联系方式
主营业务:AI 编程培训、企业内训、技术咨询
Docker 部署,一次学会,到处使用!
🎓 AI 编程实战课程
想系统学习 AI 编程?程序员晚枫的 AI 编程实战课 帮你从零上手!